'''
概述：用记事本打开图片等文件，看到一堆乱码，因为二进制文件包含许多无法显示的内容，
    所以想让记事本处理二进制文件，就需要将二进制字符串转换，base64是一种比较常用
    的二进制编码方式

编码原理：
    一个包含64个字符的数组
    ['A', 'B', ...'a', 'b', ..., '0', '1', ..., '+', '/']
    对二进制数据进行处理，每三个字节一组，一组就是3*4=24bit,划为4组，每组正好6bit
    得到4个数字作为索引，然后查表，获得相应的4个字符，就是编码后的字符串

作用：
    1、适用于小段内容的编码，比如数字证书签名，cookie，网页中传输的少量的二进制数据

注意：base64是一种通过查表的编码方法，不能用于加密，即使修改了字符对照表页也不行
'''
import base64
s1 = b"lifeibiao is a good man"
# 编码
print(base64.b64encode(s1))

s2 = b'bGlmZWliaWFvIGlzIGEgZ29vZCBtYW4='
# 解码   =补位
print(base64.b64decode(s2))

# 如果编码的二进制不是3的倍数，怎么办？
# base用\x00字节在末尾补足，在编码的末尾加上1或2个=号表示补了多少个字节，解码时会自动去掉

s3 = b"lifeibiao is a good man\x00"
# 编码
print(base64.b64encode(s3))

# 由于标准的base64编码后可能出现字符+和/，在url中不能直接出现作为参数
# 提供了urlsafe_b64encode()编码，保证url的安全，将+和/替换为-和_，提供urlsafe_b64decode()进行解码
s4 = b'lifeibiao is a good man>'
# 编码
print(base64.b64encode(s4))
print(base64.urlsafe_b64encode(s4))

s5 = b'bGlmZWliaWFvIGlzIGEgZ29vZCBtYW4+'
# 解码   =补位
print(base64.b64decode(s5))
s6 = b'bGlmZWliaWFvIGlzIGEgZ29vZCBtYW4-'
print(base64.urlsafe_b64decode(s6))

# 由于=字符也可能出现在base64编码中，但是=在url、cookie里面会造成歧义
# 所以很多base64编码后会把=去掉
s7 = b"abcd"
print(base64.b64encode(s7))
# 理论上 b"abcd"-->b'YWJjZA=='
# 实际上 b"abcd"-->b'YWJjZA'


# 可以自定义编码对照列表中64个字符的排序，这样可以自定义编码，但是通常情况下没有必要